package util

import (
	"fmt"
	"log"
	"os"
	"os/exec"

	"github.com/google/uuid"
)

// 生成唯一ID
func GetTaskID() string {
	// 自动生成唯一ID
	return uuid.New().String()
}

// 通过URL下载文件到本地/tmp目录（使用curl命令）
func DownloadFile(url string) (string, error) {
	if url == "" {
		return "", fmt.Errorf("empty URL provided")
	}

	log.Printf("开始下载文件: %s", url)

	// 创建临时文件
	tmpfile, err := os.CreateTemp("", "download-*")
	if err != nil {
		return "", fmt.Errorf("failed to create temp file: %w", err)
	}
	tmpfile.Close() // 关闭文件，让curl写入

	tmpfileName := tmpfile.Name()
	log.Printf("创建临时文件: %s", tmpfileName)

	// 使用curl命令下载，添加更多选项
	cmd := exec.Command(
		"curl",
		"-L",              // 跟随重定向
		"-o", tmpfileName, // 输出到文件
		"--fail-with-body",        // 在HTTP错误时也保存响应体
		"--connect-timeout", "30", // 连接超时时间
		"--max-time", "120", // 总操作超时时间
		"--retry", "3", // 失败时重试3次
		"--retry-delay", "2", // 重试间隔2秒
		"--retry-max-time", "60",
		"-A", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", // 设置User-Agent
		"-v", // 详细输出，帮助调试
		url,
	)

	// 设置环境变量以禁用代理
	cmd.Env = append(os.Environ(), "NO_PROXY=*")

	// 捕获标准输出和错误输出
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	log.Printf("执行curl命令下载...")
	if err := cmd.Run(); err != nil {
		return "", fmt.Errorf("curl command failed: %w", err)
	}

	// 检查文件是否下载成功
	fileInfo, err := os.Stat(tmpfileName)
	if err != nil {
		return "", fmt.Errorf("failed to stat downloaded file: %w", err)
	}

	if fileInfo.Size() == 0 {
		return "", fmt.Errorf("downloaded file is empty")
	}

	log.Printf("下载完成，文件大小: %d 字节", fileInfo.Size())

	return tmpfileName, nil
}
